<template>
  <!-- 折叠面板，手风琴模式，卡片，标题，按钮 树形 -->
  <div>
    <div class="permissManaTool">
      <el-input size="small" placeholder="请输入角色英文名" v-model="role.name">
        <template slot="prepend">ROLE_</template>
      </el-input>
      <el-input
        size="small"
        v-model="role.nameZh"
        placeholder="请输入角色中文名"
        @keydown.enter.native="doAddRole">
      </el-input>
      <el-button
        size="small"
        type="primary"
        icon="el-icon-plus"
        @click="doAddRole"
        >添加角色</el-button
      >
    </div>
    <div class="permissManaMain">
      <!-- 折叠面板 activeName【默认打开】显示哪个默认打开哪个 如果是-1 全部关掉-->
      <el-collapse v-model="activeName" accordion @change="change">
        <el-collapse-item
          :title="r.nameZh"
          :name="r.id"
          v-for="(r, index) in roles"
          :key="index"
        >
          <!-- 卡片 -->
          <el-card class="box-card">
            <div slot="header" class="clearfix">
              <span>可访问资源</span>
              <!-- r 因为删除接口要传一个参数rid doDeleteRole在一个循环里面，直接把整个r传进来 -->
              <el-button
                style="float: right; padding: 3px 0; color: #ff0000"
                type="text"
                icon="el-icon-delete"
                @click="doDeleteRole(r)"
              >
              </el-button>
            </div>
            <div>
              <!-- data就是树形菜单所要展示的数据  defaultProps 手动绑定属性 对应allmenus里面的属性 本次展示的是name和children子菜单-->
              <!-- node-key里的id是allMenus里面来的 -->
              <!-- :key="index" 刚添加完有角色（权限？）  现在用的selectMenus和allMenus是同一个 加上key之后里面的值不重复即可 自在循环里面 确认不是同一个树形控件 -->
              <!-- :key="index" （解决？）复选框的错误复用 某些节点在错误的位置被复用 -->
              <el-tree
                show-checkbox
                :data="allMenus"
                :props="defaultProps"
                ref="tree"
                :key="index"
                :default-checked-keys="selectedMenus"
                node-key="id"
              ></el-tree>
              <div style="display: flex; justify-content: flex-end">
                <el-button size="mini" @click="cancelUpdate"
                  >取消修改</el-button
                >
                <!-- doUpdate事件 后端需要传两个参数 -->
                <el-button
                  size="mini"
                  type="primary"
                  @click="doUpdate(r.id, index)"
                  >确认修改</el-button
                >
              </div>
            </div>
          </el-card>
        </el-collapse-item>
      </el-collapse>
    </div>
  </div>
</template>

<script>
export default {
  name: "PermissMana",
  data() {
    return {
      role: {
        name: "",
        nameZh: "",
      },
      // activeName: '2', //折叠手风琴默认打开的一项
      roles: [],
      allMenus: [],
      // children正常的指定节点对象里面的某个属性值
      // label节点标签为节点对象的某个属性值
      defaultProps: {
        children: "children",
        label: "name",
      },
      // 根据角色id查询菜单id，传一个id过去返回的是一串数组
      selectedMenus: [],
      activeName: -1, // 默认-1 如果是-1 全部关掉
    };
  },
  mounted() {
    this.initRoles();
  },
  methods: {
    doDeleteRole(role) {
      this.$confirm("此操作将永久删除"+role.nameZh+"角色, 是否继续?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
            this.deleteRequest('/system/basic/permiss/role/'+ role.id).then(resp => {
              if(resp){
                this.initRoles();
              }
            });
        })
        .catch(() => {
          this.$message({
            type: "info",
            message: "已取消删除",
          });
        });
    },

    doAddRole() {
      if (this.role.name && this.role.nameZh) {
        this.postRequest("/system/basic/permiss/role", this.role).then(
          (resp) => {
            if (resp) {
              this.name =''; // 添加完后清空input输入框的内容
              this.nameZh='';
              this.initRoles();
            }
          }
        );
      } else {
        this.$message.error("字段不能为空！");
      }
    },

    // 取消的时候关闭折叠版
    cancelUpdate() {
      this.activeName = -1;
    },

    // 六个tree都是一个一个数组，更新的话只拿其中的一个数组
    doUpdate(rid, index) {
      // this,代表在当前vue里，$refs代表一个引用（可以把它近似看成一个包名，）然后tree就是我们的el-tree的ref,可以理解为是该控件的一个对象，然后我们可以通过对象调用方法。
      let tree = this.$refs.tree[index];
      // getCheckedKeys 若节点可被选择(既，show-checkbox为true),则返回目前被选中的叶子节点的keys,默认值为false
      // 加上true 去掉一级菜单id 仅返回被选中的叶子节点的keys
      let selectedKeys = tree.getCheckedKeys(true); // 拿到选中的节点;
      // 菜单数组的处理 ?启到连接，传参的作用
      let url = "/system/basic/permiss/?rid=" + rid;
      // alert(url);
      // /system/basic/permiss/?rid=4
      selectedKeys.forEach((key) => {
        // 循环
        // & 不同参数之间的间隔符
        url += "&mids=" + key;
        // alert(url);
        // /system/basic/permiss/?rid=3&mids9
      });
      this.putRequest(url).then((resp) => {
        if (resp) {
          this.activeName = -1;
        }
      });
    },

    //点击展开的方法  rid展开就是1和2... 不展开就无 rid就是角色id
    change(rid) {
      if (rid) {
        this.initAllMenus();
        this.initSelectedMenus(rid);
      }
    },

    // 初始化接口
    initSelectedMenus(rid) {
      this.getRequest("/system/basic/permiss/mid/" + rid).then((resp) => {
        if (resp) {
          this.selectedMenus = resp;
        }
      });
    },

    // 初始化所有菜单
    initAllMenus() {
      this.getRequest("/system/basic/permiss/menus").then((resp) => {
        if (resp) {
          this.allMenus = resp; // 赋值更新更新
        }
      });
    },

    initRoles() {
      this.getRequest("/system/basic/permiss/").then((resp) => {
        if (resp) {
          this.roles = resp;
        }
      });
    },
  },
};
</script>

<style scoped>
.permissManaTool {
  display: flex;
  justify-content: flex-start;
}
.permissManaTool .el-input {
  width: 300px;
  margin-right: 6px;
}
.permissManaMain {
  margin-top: 10px;
  width: 700px;
}
</style>
